package top.lishuoboy.javaweb.a06servlet; /**
 * @author lishuoboy
 * @date 2021-12-29 22:02
 */

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.FileUtil;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;

/**
 * Filter 什么是过滤器
 * 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是：Servlet 程序、Listener 监听器、Filter 过滤器
 * 2、Filter 过滤器它是 JavaEE 的规范。也就是接口
 * 3、Filter 过滤器它的作用是：拦截请求，过滤响应。 拦截请求常见的应用场景有：
 * 3.1、权限检查
 * 3.2、日记操作
 * 3.3、事务管理 ……等等
 *
 * Filter 的生命周期包含几个方法
 * 1、构造器方法
 * 2、init 初始化方法。第 1，2 步，在 web 工程启动的时候执行（Filter 已经创建）
 * 3、doFilter 过滤方法。第 3 步，每次拦截到请求，就会执行
 * 4、destroy 销毁方法。第 4 步，停止 web 工程的时候，就会执行（停止 web 工程，也会销毁 Filter 过滤器）
 */
@Slf4j
@WebFilter(filterName = "CharsetFilter", urlPatterns = "/*")
public class CharsetFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.debug("过滤器 init 初始化方法");
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        log.debug("过滤器 doFilter 过滤方法");

        // 设置post请求的编码，get请求的在tomcat设置
        // 注意：req设置编码前不能get过参数，否则就不好使了
        req.setCharacterEncoding("UTF-8");

        String servletPath = ((HttpServletRequest) req).getServletPath();
        String suffix = FileUtil.getSuffix(servletPath);
        List<String> list = ListUtil.list(false, "html", "jsp", "jpg", "jpeg", "png", "bmp", "js", "css", "json");
        if (!list.contains(suffix)) {
//           以下3个都可以，如果都设置了，那么后面的覆盖前面的，其中resp.setCharacterEncoding("UTF-8");只能覆盖content-type的charset的值
//           推荐使用下面两个，因为下面两个设置了字符编码还在响应头设置了content-type，就是告诉浏览器解码字符集
//            resp.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");                                       // 前面的 text/html;可根据具体情况设置
//            ((HttpServletResponse) resp).setHeader("content-type", "text/html;charset=UTF-8");  // 前面的 text/html;可根据具体情况设置
        }
        chain.doFilter(req, resp);
    }

    @Override
    public void destroy() {
        log.debug("过滤器 destroy 销毁方法");
        Filter.super.destroy();
    }
}
